* Игра в домино. * Версия 2. С графическим отображением фишек. * Программа КОНЦЕПТ, 25.05.2011, www.gendoc.ru *** Графика *** *присвоить СТОРОНА_ФИШКИ 48 ДИАМЕТР_КРУЖКА 10 присвоить СТОРОНА_ФИШКИ 36 ДИАМЕТР_КРУЖКА 8 вычислить * ДЛИННАЯ_СТОРОНА_ФИШКИ [СТОРОНА_ФИШКИ] 2 вычислить / ПОЛОВИНА_СТОРОНЫ_ФИШКИ [СТОРОНА_ФИШКИ] 2 вычислить / ЧЕТВЕРТЬ_СТОРОНЫ_ФИШКИ [СТОРОНА_ФИШКИ] 4 вычислить - ТРИ_ЧЕТВЕРТИ_СТОРОНЫ_ФИШКИ [СТОРОНА_ФИШКИ] [ЧЕТВЕРТЬ_СТОРОНЫ_ФИШКИ] вычислить / РАДИУС_КРУЖКА [ДИАМЕТР_КРУЖКА] 2 присвоить ЦВЕТ_ФИШКИ 8 ЦВЕТ_КОНТУРА 1 ЦВЕТ_КРУЖКА 15 ЦВЕТ_СТРЕЛКИ 15 ЦВЕТ_НАДПИСИ 1 вычислить / КОЛБАСА_ЛЕВЫЙ_Х [$ШиринаОбластиГрафики] 2 вычислить / КОЛБАСА_ЛЕВЫЙ_У [$ВысотаОбластиГрафики] 2 присвоить КОЛБАСА_ПРАВЫЙ_Х [КОЛБАСА_ЛЕВЫЙ_Х] КОЛБАСА_ПРАВЫЙ_У [КОЛБАСА_ЛЕВЫЙ_У] функция Рисовать_фишку фишка центр_х центр_у ориентация присвоить $ЦветЛинии [ЦВЕТ_КОНТУРА] $ТолщинаЛинии 1 если [ориентация] == горизонтально Рисовать_половинку_фишки \ (строка взять $результат [фишка] 1 ) \ (вычислить - $результат [центр_х] [СТОРОНА_ФИШКИ] ) \ (вычислить - $результат [центр_у] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] ) \ [ориентация] Рисовать_половинку_фишки \ (строка взять $результат [фишка] 2 ) \ [центр_х] \ (вычислить - $результат [центр_у] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] ) \ [ориентация] иначе Рисовать_половинку_фишки \ (строка взять $результат [фишка] 1 ) \ (вычислить - $результат [центр_х] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] ) \ (вычислить - $результат [центр_у] [СТОРОНА_ФИШКИ] ) \ [ориентация] Рисовать_половинку_фишки \ (строка взять $результат [фишка] 2 ) \ (вычислить - $результат [центр_х] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] ) \ [центр_у] \ [ориентация] конец возврат функция Рисовать_половинку_фишки число_точек х1 у1 ориентация присвоить $ЦветКисти [ЦВЕТ_ФИШКИ] вычислить + х2 [х1] [СТОРОНА_ФИШКИ] вычислить + у2 [у1] [СТОРОНА_ФИШКИ] рисовать прямоугольник [х1] [у1] [х2] [у2] * рисовать текстВПрямоугольнике [х1] [у1] [х2] [у2] [число_точек] если (множество и $результат [число_точек] 1;3;5 ) Рисовать_кружок_фишки \ (вычислить + $результат [х1] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] ) \ (вычислить + $результат [у1] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] ) конец если (множество и $результат [число_точек] 2;3;4;5;6 ) Рисовать_кружок_фишки \ (вычислить + $результат [х1] [ЧЕТВЕРТЬ_СТОРОНЫ_ФИШКИ] ) \ (вычислить + $результат [у1] [ЧЕТВЕРТЬ_СТОРОНЫ_ФИШКИ] ) Рисовать_кружок_фишки \ (вычислить + $результат [х1] [ТРИ_ЧЕТВЕРТИ_СТОРОНЫ_ФИШКИ] ) \ (вычислить + $результат [у1] [ТРИ_ЧЕТВЕРТИ_СТОРОНЫ_ФИШКИ] ) конец если (множество и $результат [число_точек] 4;5;6 ) Рисовать_кружок_фишки \ (вычислить + $результат [х1] [ТРИ_ЧЕТВЕРТИ_СТОРОНЫ_ФИШКИ] ) \ (вычислить + $результат [у1] [ЧЕТВЕРТЬ_СТОРОНЫ_ФИШКИ] ) Рисовать_кружок_фишки \ (вычислить + $результат [х1] [ЧЕТВЕРТЬ_СТОРОНЫ_ФИШКИ] ) \ (вычислить + $результат [у1] [ТРИ_ЧЕТВЕРТИ_СТОРОНЫ_ФИШКИ] ) конец если [число_точек] == 6 если [ориентация] == горизонтально Рисовать_кружок_фишки \ (вычислить + $результат [х1] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] ) \ (вычислить + $результат [у1] [ЧЕТВЕРТЬ_СТОРОНЫ_ФИШКИ] ) Рисовать_кружок_фишки \ (вычислить + $результат [х1] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] ) \ (вычислить + $результат [у1] [ТРИ_ЧЕТВЕРТИ_СТОРОНЫ_ФИШКИ] ) иначе Рисовать_кружок_фишки \ (вычислить + $результат [х1] [ЧЕТВЕРТЬ_СТОРОНЫ_ФИШКИ] ) \ (вычислить + $результат [у1] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] ) Рисовать_кружок_фишки \ (вычислить + $результат [х1] [ТРИ_ЧЕТВЕРТИ_СТОРОНЫ_ФИШКИ] ) \ (вычислить + $результат [у1] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] ) конец конец возврат функция Рисовать_кружок_фишки х у присвоить $ЦветКисти [ЦВЕТ_КРУЖКА] рисовать круг \ (вычислить - $результат [х] [РАДИУС_КРУЖКА] ) \ (вычислить - $результат [у] [РАДИУС_КРУЖКА] ) \ (вычислить + $результат [х] [РАДИУС_КРУЖКА] ) \ (вычислить + $результат [у] [РАДИУС_КРУЖКА] ) возврат функция Рисовать_стрелку_переноса х у направление память локальный у1 у2 х1 вычислить - у1 [у] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] вычислить + у2 [у] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] если [направление] == вправо вычислить + х1 [х] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] иначе вычислить - х1 [х] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] конец присвоить $ЦветКисти [ЦВЕТ_СТРЕЛКИ] $ЦветЛинии [ЦВЕТ_СТРЕЛКИ] рисовать треугольник [х] [у1] [х] [у2] [х1] [у] возврат функция Поставь_фишку_в_колбасу фишка край_колбасы память локальный сдвиг_центр сдвиг_фишка ориентация у х1 у1 если (множество и $результат [фишка] 00;11;22;33;44;55;66 ) присвоить ориентация вертикально сдвиг_центр [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] сдвиг_фишка [СТОРОНА_ФИШКИ] иначе присвоить ориентация горизонтально сдвиг_центр [СТОРОНА_ФИШКИ] сдвиг_фишка [ДЛИННАЯ_СТОРОНА_ФИШКИ] конец если [край_колбасы] == справа * Перенос колбасы на другой уровень, если не помещается в одну линию если [КОЛБАСА_ПРАВЫЙ_Х] >= (вычислить - $результат [$ШиринаОбластиГрафики] [ДЛИННАЯ_СТОРОНА_ФИШКИ] ) Рисовать_стрелку_переноса [КОЛБАСА_ПРАВЫЙ_Х] [КОЛБАСА_ПРАВЫЙ_У] вправо вычислить / КОЛБАСА_ПРАВЫЙ_Х [$ШиринаОбластиГрафики] 2 вычислить - КОЛБАСА_ПРАВЫЙ_У $ [ДЛИННАЯ_СТОРОНА_ФИШКИ] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] Рисовать_стрелку_переноса (вычислить - $результат [КОЛБАСА_ПРАВЫЙ_Х] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] ) [КОЛБАСА_ПРАВЫЙ_У] вправо конец вычислить + сдвиг_центр $ [КОЛБАСА_ПРАВЫЙ_Х] вычислить + КОЛБАСА_ПРАВЫЙ_Х $ [сдвиг_фишка] присвоить у [КОЛБАСА_ПРАВЫЙ_У] иначе * Перенос колбасы на другой уровень, если не помещается в одну линию если [КОЛБАСА_ЛЕВЫЙ_Х] <= [ДЛИННАЯ_СТОРОНА_ФИШКИ] Рисовать_стрелку_переноса [КОЛБАСА_ЛЕВЫЙ_Х] [КОЛБАСА_ЛЕВЫЙ_У] влево вычислить / КОЛБАСА_ЛЕВЫЙ_Х [$ШиринаОбластиГрафики] 2 вычислить + КОЛБАСА_ЛЕВЫЙ_У $ [ДЛИННАЯ_СТОРОНА_ФИШКИ] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] Рисовать_стрелку_переноса (вычислить + $результат [КОЛБАСА_ЛЕВЫЙ_Х] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] ) [КОЛБАСА_ЛЕВЫЙ_У] влево конец вычислить - сдвиг_центр [КОЛБАСА_ЛЕВЫЙ_Х] [сдвиг_центр] вычислить - КОЛБАСА_ЛЕВЫЙ_Х $ [сдвиг_фишка] присвоить у [КОЛБАСА_ЛЕВЫЙ_У] конец Рисовать_фишку [фишка] [сдвиг_центр] [у] [ориентация] возврат функция Рисовать_фишки_на_руке х у фишки_на_руке для [фишки_на_руке] Рисовать_фишку [$ОбъектЦикла] [х] [у] вертикально увеличить х [СТОРОНА_ФИШКИ] следующий присвоить $ЦветКисти 16 $ЦветЛинии 16 рисовать прямоугольник \ (вычислить - $результат [х] [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] ) \ (вычислить - $результат [у] [СТОРОНА_ФИШКИ] ) \ [$ШиринаОбластиГрафики] \ (вычислить + $результат [у] [СТОРОНА_ФИШКИ] ) возврат функция Рисовать_фишки_компьютера присвоить $ЦветТекста [ЦВЕТ_НАДПИСИ] $ЦветКисти 16 рисовать текст [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] (вычислить - $результат [СТОРОНА_ФИШКИ] 20 ) Компьютер Рисовать_фишки_на_руке [СТОРОНА_ФИШКИ] [ДЛИННАЯ_СТОРОНА_ФИШКИ] [РУКА_КОМПЬЮТЕРА] возврат функция Рисовать_фишки_игрока память локальный у вычислить - у [$ВысотаОбластиГрафики] [ДЛИННАЯ_СТОРОНА_ФИШКИ] [СТОРОНА_ФИШКИ] присвоить $ЦветТекста [ЦВЕТ_НАДПИСИ] $ЦветКисти 16 рисовать текст [ПОЛОВИНА_СТОРОНЫ_ФИШКИ] (вычислить - $результат [у] [СТОРОНА_ФИШКИ] 20 ) Игрок Рисовать_фишки_на_руке [СТОРОНА_ФИШКИ] [у] [РУКА_ИГРОКА] возврат *** Основные функции функция Протокол текст >[текст] возврат функция ПротоколN текст для [текст] >[$ОбъектЦикла] следующий возврат * Обозначения: * кл - колбаса, левый край * кп - колбаса, правый край * фл - фишка, левый край * фп - фишка, правый край функция Ставь_фишку фишка_проверенная память локальный варианты вариант кл кп фл фп ответ строка взять кл [КОЛБАСА] 1 строка взять кп [КОЛБАСА] (строка размер $результат [КОЛБАСА] ) строка взять фл [фишка_проверенная] 1 строка взять фп [фишка_проверенная] 2 Ход_допустимый? варианты [фишка_проверенная] * Приставить фишку к колбасе если [КОЛБАСА] == {} список сцепить КОЛБАСА [КОЛБАСА] [фишка_проверенная] Поставь_фишку_в_колбасу [фишка_проверенная] справа иначе список голова вариант [варианты] если [КТО_ХОДИТ] == игрок если (список размер $результат [варианты] ) == 2 если (вычислить и $результат (вычислить != $результат [кл] [кп] ) (вычислить != $результат [фл] [фп] ) ) ввести меню1 ответ "Куда ставить фишку [фишка_проверенная]?" слева;справа если [ответ] == слева если [кл] == [фл] присвоить вариант лл иначе присвоить вариант лп конец иначе если [кп] == [фл] присвоить вариант пл иначе присвоить вариант пп конец конец конец конец конец выбрать [вариант] вариант лл список сцепить КОЛБАСА "[фп][фл]" [КОЛБАСА] Поставь_фишку_в_колбасу "[фп][фл]" слева вариант лп список сцепить КОЛБАСА "[фл][фп]" [КОЛБАСА] Поставь_фишку_в_колбасу "[фл][фп]" слева вариант пл список сцепить КОЛБАСА [КОЛБАСА] "[фл][фп]" Поставь_фишку_в_колбасу "[фл][фп]" справа вариант пп список сцепить КОЛБАСА [КОЛБАСА] "[фп][фл]" Поставь_фишку_в_колбасу "[фп][фл]" справа конецВыбора конец * Убрать фишку с руки если [КТО_ХОДИТ] == компьютер множество разность РУКА_КОМПЬЮТЕРА [РУКА_КОМПЬЮТЕРА] [фишка_проверенная] Протокол "Комп: [фишка_проверенная] [РУКА_КОМПЬЮТЕРА]" иначе множество разность РУКА_ИГРОКА [РУКА_ИГРОКА] [фишка_проверенная] Протокол "Игрок: [фишка_проверенная] [РУКА_ИГРОКА]" конец возврат функция Ход_допустимый? варианты_установки фишка_кандидат память локальный кл кп фл фп присвоить [варианты_установки] {} если [КОЛБАСА] == {} присвоить [варианты_установки] лл;лп;пл;пп иначе строка взять кл [КОЛБАСА] 1 строка взять кп [КОЛБАСА] (строка размер $результат [КОЛБАСА] ) строка взять фл [фишка_кандидат] 1 строка взять фп [фишка_кандидат] 2 если [кл] == [фл] множество или [варианты_установки] [[варианты_установки]] лл конец если [кл] == [фп] множество или [варианты_установки] [[варианты_установки]] лп конец если [кп] == [фл] множество или [варианты_установки] [[варианты_установки]] пл конец если [кп] == [фп] множество или [варианты_установки] [[варианты_установки]] пп конец конец возврат функция Есть_чем_ходить? варианты_ходов на_руке память локальный варианты_установки_фишки присвоить [варианты_ходов] {} если [КОЛБАСА] для [на_руке] Ход_допустимый? варианты_установки_фишки [$ОбъектЦикла] если [варианты_установки_фишки] множество или [варианты_ходов] [[варианты_ходов]] [$ОбъектЦикла] конец следующий иначе присвоить [варианты_ходов] [на_руке] конец возврат функция Иди_на_базар рука память локальный кол фишка варианты взято_с_базара присвоить кол 0 присвоить взято_с_базара {} для [КОЛОДА] вычислить + кол [кол] 1 список выбратьСлучайный фишка [КОЛОДА] множество разность КОЛОДА [КОЛОДА] [фишка] множество или [рука] [[рука]] [фишка] список сцепить взято_с_базара [взято_с_базара] [фишка] Ход_допустимый? варианты [фишка] если [варианты] присвоить $СписокЦикла {} конец следующий если [кол] > 0 показать сообщение "[рука] сходил на базар [кол] раз!" Протокол "[рука] сходил на базар [кол] раз! [взято_с_базара]" конец возврат функция Ход_компьютера память локальный фишка варианты дупель_найден фл фп присвоить КТО_ХОДИТ компьютер Есть_чем_ходить? варианты [РУКА_КОМПЬЮТЕРА] * показать сообщение "Варианты компьютера: [варианты] Колбаса: [КОЛБАСА] На руке: [РУКА_КОМПЬЮТЕРА]" если [варианты] == {} Иди_на_базар РУКА_КОМПЬЮТЕРА конец если [РУКА_КОМПЬЮТЕРА] Есть_чем_ходить? варианты [РУКА_КОМПЬЮТЕРА] если [варианты] * Здесь логика выбора оптимального хода компьютером !!! список инвертировать варианты [варианты] присвоить дупель_найден '' для [варианты] строка взять фл [$ОбъектЦикла] 1 строка взять фп [$ОбъектЦикла] 2 если [фл] == [фп] присвоить дупель_найден [$ОбъектЦикла] присвоить $СписокЦикла {} конец следующий если [дупель_найден] присвоить фишка [дупель_найден] иначе список взять фишка [варианты] 1 конец Ставь_фишку [фишка] иначе показать сообщение "Компьютер катом." Протокол "Компьютер катом. [РУКА_КОМПЬЮТЕРА] [КОЛОДА]" конец конец Рисовать_фишки_компьютера Игра_окончена? возврат функция Ход_игрока память локальный фишка варианты рука_с_подсказкой вариант присвоить КТО_ХОДИТ игрок Рисовать_фишки_игрока Есть_чем_ходить? варианты [РУКА_ИГРОКА] * показать сообщение "Варианты игрока: [варианты] Колбаса: [КОЛБАСА] На руке: [РУКА_ИГРОКА]" если [варианты] == {} Иди_на_базар РУКА_ИГРОКА Рисовать_фишки_игрока конец если [РУКА_ИГРОКА] Есть_чем_ходить? варианты [РУКА_ИГРОКА] если [варианты] присвоить рука_с_подсказкой {} для [РУКА_ИГРОКА] множество и вариант [$ОбъектЦикла] [варианты] если [вариант] список сцепить рука_с_подсказкой [рука_с_подсказкой] ">[$ОбъектЦикла]" иначе список сцепить рука_с_подсказкой [рука_с_подсказкой] " [$ОбъектЦикла]" конец следующий для 1 ввести меню1 фишка '' [рука_с_подсказкой] строка удалить фишка [фишка] 1 1 Ход_допустимый? варианты [фишка] если [варианты] Ставь_фишку [фишка] иначе показать сообщение "Недопустимый ход [фишка]!" присвоить $СписокЦикла 1 конец следующий иначе показать сообщение "Игрок катом." Протокол "Игрок катом. [РУКА_ИГРОКА] [КОЛОДА]" конец конец Рисовать_фишки_игрока Игра_окончена? возврат функция Игра_окончена? память локальный игра_окончена очки_комп очки_игрок победитель память локальный кл кп фл фп длина кол присвоить игра_окончена нет если [КТО_ХОДИТ] == компьютер если [РУКА_КОМПЬЮТЕРА] == {} присвоить игра_окончена да конец иначе если [РУКА_ИГРОКА] == {} присвоить игра_окончена да конец конец * или обоим нечем ходить и на базаре нет допустимых фишек (РЫБА) строка размер длина [КОЛБАСА] строка взять кл [КОЛБАСА] 1 строка взять кп [КОЛБАСА] [длина] если [кл] == [кп] присвоить кол 0 для [КОЛБАСА] строка взять фл [$ОбъектЦикла] 1 строка взять фп [$ОбъектЦикла] 2 если [фл] == [кл] вычислить + кол [кол] 1 конец если [фп] == [кп] вычислить + кол [кол] 1 конец следующий если [кол] = 8 присвоить игра_окончена да показать сообщение 'Рыба!!!' конец конец если [игра_окончена] == да Подсчет_очков_на_руке [РУКА_КОМПЬЮТЕРА] присвоить очки_комп [Подсчет_очков_на_руке] Подсчет_очков_на_руке [РУКА_ИГРОКА] присвоить очки_игрок [Подсчет_очков_на_руке] > >Результат > Компьютер: [очки_комп] - Игрок: [очки_игрок] > Колбаса: [КОЛБАСА] > Компьютер: [РУКА_КОМПЬЮТЕРА] > Игрок: [РУКА_ИГРОКА] > Колода: [КОЛОДА] присвоить победитель ничья если [очки_комп] < [очки_игрок] присвоить победитель компьютер показать сообщение "Я выиграл :)!" конец если [очки_комп] > [очки_игрок] присвоить победитель игрок показать сообщение "Вы выиграли :(!" конец если [очки_комп] = [очки_игрок] показать сообщение "Боевая ничья!" конец стоп конец возврат функция Подсчет_очков_на_руке на_руке память локальный фл фп присвоить Подсчет_очков_на_руке 0 если [на_руке] == 00 присвоить Подсчет_очков_на_руке 10 иначе для фишка [на_руке] строка взять фл [фишка] 1 строка взять фп [фишка] 2 присвоить Подсчет_очков_на_руке (вычислить + $результат [Подсчет_очков_на_руке] [фл] [фп] ) следующий конец возврат функция Генерация_колоды память локальный x y присвоить КОЛОДА {} список сгенерить ТОЧКИ 0 6 для x [ТОЧКИ] для y [ТОЧКИ] если [x] <= [y] множество или КОЛОДА [КОЛОДА] "[x][y]" конец следующий следующий возврат функция Сдача_фишек набор_фишек память локальный рука фишка присвоить рука {} для 1;2;3;4;5;6;7 список выбратьСлучайный фишка [КОЛОДА] множество разность КОЛОДА [КОЛОДА] [фишка] множество или рука [рука] [фишка] следующий присвоить [набор_фишек] [рука] возврат *** Начало основного кода присвоить КОЛБАСА {} Генерация_колоды Сдача_фишек РУКА_КОМПЬЮТЕРА Сдача_фишек РУКА_ИГРОКА ПротоколN "Протокол игры в домино;;Начальная раздача" Протокол " Компьютер: [РУКА_КОМПЬЮТЕРА]" Протокол " Игрок: [РУКА_ИГРОКА]" присвоить ХОД 1 пока [ХОД] Протокол '' Протокол "ход N [ХОД]" Протокол "Колбаса: [КОЛБАСА]" Ход_компьютера Ход_игрока вычислить + ХОД [ХОД] 1 цикл